# 导入MaixCAM所需的模块（按照示例格式）
from maix import pwm, time, pinmap, sys, err

# 根据设备ID获取引脚和PWM编号（按照示例格式）
device_id = sys.device_id()
if device_id == "maixcam2":
    pin_name_a18 = "IO1_A25"  # 对于maixcam2，使用IO1_A25
    pin_name_a19 = "IO0_A31"  # 对于maixcam2，使用IO0_A31 
    pin_name_a16 = "IO2_A26"  # 对于maixcam2，使用IO2_A26（原A28改为A16）
    pin_name_a17 = "IO3_A27"  # 对于maixcam2，使用IO3_A27（原A29改为A17）
    pwm_id_a18 = 6
    pwm_id_a19 = 7
    pwm_id_a16 = 4  # A16对应PWM4
    pwm_id_a17 = 5  # A17对应PWM5
else:
    pin_name_a18 = "A18"  # A18引脚
    pin_name_a19 = "A19"  # A19引脚
    pin_name_a16 = "A16"  # A16引脚（原A28改为A16）
    pin_name_a17 = "A17"  # A17引脚（原A29改为A17）
    pwm_id_a18 = 6
    pwm_id_a19 = 7
    pwm_id_a16 = 4  # A16对应PWM4
    pwm_id_a17 = 5  # A17对应PWM5

print(f"设备ID: {device_id}")
print(f"A18引脚: {pin_name_a18}, PWM{pwm_id_a18}")
print(f"A19引脚: {pin_name_a19}, PWM{pwm_id_a19}")
print(f"A16引脚: {pin_name_a16}, PWM{pwm_id_a16}")
print(f"A17引脚: {pin_name_a17}, PWM{pwm_id_a17}")

# 设置引脚映射（按照示例格式）
print("设置引脚映射...")
err.check_raise(pinmap.set_pin_function(pin_name_a18, f"PWM{pwm_id_a18}"), "set A18 pinmap failed")
err.check_raise(pinmap.set_pin_function(pin_name_a19, f"PWM{pwm_id_a19}"), "set A19 pinmap failed")
err.check_raise(pinmap.set_pin_function(pin_name_a16, f"PWM{pwm_id_a16}"), "set A16 pinmap failed")
err.check_raise(pinmap.set_pin_function(pin_name_a17, f"PWM{pwm_id_a17}"), "set A17 pinmap failed")

# PWM参数定义（按照示例格式）
SERVO_PERIOD = 100000     # 100kHz 0.01ms（保持示例中的频率）

# 创建PWM对象并设置为低电平（占空比0）
print("初始化PWM输出...")
out_a18 = pwm.PWM(pwm_id_a18, freq=SERVO_PERIOD, duty=0, enable=True)
out_a19 = pwm.PWM(pwm_id_a19, freq=SERVO_PERIOD, duty=0, enable=True)
out_a16 = pwm.PWM(pwm_id_a16, freq=SERVO_PERIOD, duty=0, enable=True)
out_a17 = pwm.PWM(pwm_id_a17, freq=SERVO_PERIOD, duty=0, enable=True)

# 确保所有引脚都设置为低电平（占空比0表示低电平）
print("设置所有引脚为低电平...")
out_a18.duty(0)  # A18设置为0%占空比（低电平）
out_a19.duty(0)  # A19设置为0%占空比（低电平）
out_a16.duty(0)  # A16设置为0%占空比（低电平）
out_a17.duty(0)  # A17设置为0%占空比（低电平）

print("GPIO设置完成:")
print("- A18: 低电平 (占空比: 0%)")
print("- A19: 低电平 (占空比: 0%)")
print("- A16: 低电平 (占空比: 0%)")
print("- A17: 低电平 (占空比: 0%)")
print("程序结束")

# ================================
# 四个引脚同步交替控制功能（按照示例格式）
# A18/A16同步控制，A19/A17同步控制
# ================================

print("\n开始四个引脚同步交替控制...")
print("控制模式: A19/A17高 + A18/A16低 (10秒) -> A19/A17低 + A18/A16高 (10秒)")
print("重复次数: 3次")
print("同步关系: A18与A16同步，A19与A17同步")

# 执行3次交替控制循环
for cycle in range(3):
    print(f"\n=== 第{cycle + 1}次循环 ===")
    
    # 第一阶段：A19/A17高电平(100%)，A18/A16低电平(0%) - 持续10秒
    print("阶段1: A19/A17=高电平(100%), A18/A16=低电平(0%) - 10秒")
    out_a19.duty(100)  # A19设置为100%占空比（高电平）
    out_a17.duty(100)  # A17设置为100%占空比（高电平）
    out_a18.duty(0)    # A18设置为0%占空比（低电平）
    out_a16.duty(0)    # A16设置为0%占空比（低电平）
    
    # 等待10秒（分成10个1秒间隔，便于观察）
    for second in range(10):
        print(f"  剩余时间: {10 - second}秒 - A19/A17=高, A18/A16=低")
        time.sleep_ms(1000)  # 等待1秒
    
    # 第二阶段：A19/A17低电平(0%)，A18/A16高电平(100%) - 持续10秒
    print("阶段2: A19/A17=低电平(0%), A18/A16=高电平(100%) - 10秒")
    out_a19.duty(0)    # A19设置为0%占空比（低电平）
    out_a17.duty(0)    # A17设置为0%占空比（低电平）
    out_a18.duty(100)  # A18设置为100%占空比（高电平）
    out_a16.duty(100)  # A16设置为100%占空比（高电平）
    
    # 等待10秒（分成10个1秒间隔，便于观察）
    for second in range(10):
        print(f"  剩余时间: {10 - second}秒 - A19/A17=低, A18/A16=高")
        time.sleep_ms(1000)  # 等待1秒

# 控制结束后，将所有引脚都设置为低电平
print("\n交替控制完成，恢复初始状态...")
out_a18.duty(0)  # A18设置为0%占空比（低电平）
out_a19.duty(0)  # A19设置为0%占空比（低电平）
out_a16.duty(0)  # A16设置为0%占空比（低电平）
out_a17.duty(0)  # A17设置为0%占空比（低电平）

print("最终状态:")
print("- A18: 低电平 (占空比: 0%)")
print("- A19: 低电平 (占空比: 0%)")
print("- A16: 低电平 (占空比: 0%)")
print("- A17: 低电平 (占空比: 0%)")
print("四引脚同步交替控制程序执行完毕")

# ================================
# 保留的示例代码（已注释，可用于未来参考）
# ================================

# # 原始示例中的PWM占空比变化循环
# # 从0到99的占空比变化
# for i in range(100):
#     print(i)
#     out_a18.duty(i)  # A18占空比变化
#     out_a19.duty(i)  # A19占空比变化
#     time.sleep_ms(100)
# 
# # 从99到0的占空比变化
# for i in range(100):
#     duty_value = 100 - i
#     print(duty_value)
#     out_a18.duty(duty_value)  # A18占空比变化
#     out_a19.duty(duty_value)  # A19占空比变化
#     time.sleep_ms(100)

# ================================
# 使用说明：
# 1. 当前代码将A18和A19都设置为低电平（占空比0%）
# 2. 取消上面注释的循环代码可以看到PWM占空比变化效果
# 3. 代码严格按照示例格式编写，保持变量命名一致
# 4. 支持maixcam2和其他设备的自动检测
# ================================